package main

import (
	"fmt"
	"sync"
	// "time"
)

var wg sync.WaitGroup

func main() {
	fmt.Println("<<<< 多线程测试 >>>>")
	// go sayHello("lily")
	// sayHello("tom <main>")
	// time.Sleep(1000 * time.Millisecond)

	// for i := 0; i < 10; i++ {
	// 	// 启动一个goroutine就登记+1
	// 	wg.Add(1)
	// 	go sayHello2(i)
	// }
	// // 等待所有登记的goroutine都结束
	// wg.Wait()

	ch1 := make(chan int, 2)
	ch2 := make(chan int, 2)

	// 开启goroutine将0~100的数发送到ch1中
	go func() {
		for i := 0; i < 10; i++ {
			ch1 <- i
		}
		close(ch1)
	}()

	// 开启goroutine从ch1中接收值，并将该值的平方发送到ch2中
	go func() {
		for {
			// 通道关闭后再取值ok=false
			i, ok := <-ch1
			if !ok {
				break
			}
			ch2 <- i * i
		}
		close(ch2)
	}()

	// 在主goroutine中从ch2中接收值打印
	// 通道关闭后会退出for range循环
	for i := range ch2 {
		fmt.Println(i)
	}

}

func sayHello(name string) {
	fmt.Printf("hello %v ... \n", name)
}

func sayHello2(i int) {
	// goroutine结束就登记-1
	defer wg.Done()
	fmt.Println("hello goroutine! ", i)
}
